#include <iostream>
#include "Circle.h"

using namespace std;
using namespace Circle;

int getMax(int a, int b, bool (*p)(int a, int b));

int main()
{
    double rad = 5;
//    cout << "LengthOfCircle: " << Cir::getLengthOfCircle(rad) << endl;
//    cout << "AreaOfCircle: " << Cir::getAreaOfCircle(rad) << endl;

    cout << "LengthOfCircle: " << getLengthOfCircle(rad) << endl;
    cout << "AreaOfCircle: " << getAreaOfCircle(rad) << endl;

    cout << "-- 1.basic type maxValue minValue --" << endl;
    cout << "int maxValue: " << INT_MAX << endl;
    cout << "int minValue: " << INT_MIN << endl;

    cout << "uint maxValue: " << UINT_MAX << endl;

    cout << "long int maxValue: " << LONG_MAX << endl;
    cout << "long int maxValue: " << LONG_MIN << endl;

    cout << "long long int maxValue: " << LLONG_MAX << endl;
    cout << "long long int maxValue: " << LLONG_MIN << endl;

    cout << "-- 2.inline function --" << endl;
    /* 特点
     * 减少函数调用开销: 内联函数通常用于优化小型、频繁调用的函数, 因为它避免了函数调用的常规开销(如参数传递、栈操作等)
     * 编译器决策: 即使函数被声明为内联, 编译器也可能决定不进行内联, 特别是对于复杂或递归函数
     * 适用于小型函数: 通常只有简单的、执行时间短的函数适合做内联
     * 定义在每个使用点: 内联函数的定义(而非仅是声明)必须对每个使用它的文件都可见, 通常意味着将内联函数定义在头文件中
     */

    int res = max(26, 54); // 相当于那段代码就在这
    cout << res << endl;

    /* 注意事项:
     * 过度使用的风险：不应滥用内联函数, 因为这可能会增加最终程序的大小(代码膨胀)。对于大型函数或递归函数, 内敛可能导致性能下降
     * 编译器的决定：最终是否将函数内联是由编译器决定的, 即使函数被标记为inline
     * 适用场景：最适合内联的是小型函数和在性能要求高的代码中频繁调用的函数
     *
     * 内联函数是一种用于优化程序性能的工具，但需要合理使用，以确保代码的可维护性和性能的平衡
     */

    cout << "-- 3.1 Lambda --" << endl;
    auto add = [](int a, int b)-> int
    {
        return a + b;
    };
    cout << add(26, 54) << endl;

    int a = 26;
    int b = 54;
    int res1= getMax(a, b, [](int a, int b)-> bool
    {
        return a > b;
    });
    cout << res1 << endl;

    cout << "-- 3.2 Lambda catch params --" << endl;
    int x = 26;
    int y = 54;
    [x, y]()->int
    {
        return x+y;
    };

    return 0;
}

int getMax(int a, int b, bool (*p)(int a, int b))
{
    if(p(a, b))
    {
        return a;
    }
    return b;
}

inline int max(int x, int y)
{
    return x > y ? x : y;
}
